/**
 * 用户模型类
 * 处理用户数据的持久化和业务逻辑
 * 
 * 功能：
 * 1. 用户数据的CRUD操作
 * 2. 密码加密和验证
 * 3. 用户查询
 * 
 * 数据库表结构：
 * users {
 *   id: int(11) PRIMARY KEY AUTO_INCREMENT,
 *   username: varchar(255) NOT NULL,
 *   email: varchar(255) NOT NULL UNIQUE,
 *   password: varchar(255) NOT NULL,
 *   created_at: timestamp DEFAULT CURRENT_TIMESTAMP
 * }
 */

const db = require('../config/database');
const bcrypt = require('bcryptjs');

class User {
  /**
   * 创建新用户
   * @param {Object} userData - 用户数据
   * @param {string} userData.username - 用户名
   * @param {string} userData.email - 电子邮件
   * @param {string} userData.password - 原始密码
   * @returns {Promise<number>} 新创建用户的ID
   */
  static async create(userData) {
    const { username, email, password } = userData;
    const hashedPassword = await bcrypt.hash(password, 10);
    
    const [result] = await db.execute(
      'INSERT INTO users (username, email, password) VALUES (?, ?, ?)',
      [username, email, hashedPassword]
    );
    return result.insertId;
  }

  /**
   * 通过邮箱查找用户
   * @param {string} email - 用户邮箱
   * @returns {Promise<Object|null>} 用户对象或null
   */
  static async findByEmail(email) {
    const [rows] = await db.execute('SELECT * FROM users WHERE email = ?', [email]);
    return rows[0];
  }

  /**
   * 通过ID查找用户
   * @param {number} id - 用户ID
   * @returns {Promise<Object|null>} 用户对象或null
   */
  static async findById(id) {
    const [rows] = await db.execute('SELECT * FROM users WHERE id = ?', [id]);
    return rows[0];
  }

  /**
   * 更新用户密码
   * @param {number} userId - 用户ID
   * @param {string} newPassword - 新密码
   * @returns {Promise<boolean>} 更新是否成功
   */
  static async updatePassword(userId, newPassword) {
    const hashedPassword = await bcrypt.hash(newPassword, 10);
    const [result] = await db.execute(
      'UPDATE users SET password = ? WHERE id = ?',
      [hashedPassword, userId]
    );
    return result.affectedRows > 0;
  }

  /**
   * 更新用户信息
   * @param {number} userId - 用户ID
   * @param {Object} userData - 用户数据
   * @param {string} userData.username - 新用户名
   * @param {string} userData.email - 新邮箱
   * @returns {Promise<boolean>} 更新是否成功
   */
  static async update(userId, userData) {
    const { username, email } = userData;
    const [result] = await db.execute(
      'UPDATE users SET username = ?, email = ? WHERE id = ?',
      [username, email, userId]
    );
    return result.affectedRows > 0;
  }

  /**
   * 删除用户
   * @param {number} userId - 用户ID
   * @returns {Promise<boolean>} 删除是否成功
   */
  static async delete(userId) {
    const [result] = await db.execute('DELETE FROM users WHERE id = ?', [userId]);
    return result.affectedRows > 0;
  }

  /**
   * 比较密码
   * @param {string} password - 原始密码
   * @param {string} hashedPassword - 加密后的密码
   * @returns {Promise<boolean>} 密码是否匹配
   */
  static async comparePassword(password, hashedPassword) {
    return bcrypt.compare(password, hashedPassword);
  }

  /**
   * 通过邮箱或用户名查找用户
   * @param {string} account - 邮箱或用户名
   * @returns {Promise<Object|null>} 用户对象或null
   */
  static async findByEmailOrUsername(account) {
    const [rows] = await db.execute(
      'SELECT * FROM users WHERE email = ? OR username = ?', 
      [account, account]
    );
    return rows[0];
  }
}

module.exports = User;
